package cn.iocoder.yudao.module.infrastructure.config.api;

import cn.hutool.core.util.ReflectUtil;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.api.infrastructure.config.ConfigApiV2;
import cn.iocoder.yudao.module.infrastructure.config.dal.dataobject.ConfigDO;
import cn.iocoder.yudao.module.infrastructure.config.dal.mysql.ConfigMapper;
import cn.iocoder.yudao.module.infrastructure.config.enums.ConfigTypeEnum;
import cn.iocoder.yudao.module.infrastructure.config.service.ConfigService;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  这里是文件说明
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/02/06
 * @see ConfigApiImpl
 */
@Slf4j
@Service
@Validated
public class ConfigApiV2Impl implements ConfigApiV2 {
    @Resource
    private ConfigMapper configMapper;
    @Resource
    private ConfigService configService;

    @Override
    public <T> void saveConfig(String key, T value) {
        ConfigDO config = configService.getConfigByKey(key);
        if (config == null) {
            configMapper.insert(new ConfigDO()
                    .setName("自定义配置")
                    .setCategory("biz")
                    .setType(ConfigTypeEnum.CUSTOM.getType())
                    .setVisible(false)
                    .setConfigKey(key)
                    .setValue(JsonUtils.toJsonString(value)));
            return;
        }
        ConfigDO updateObj = new ConfigDO();
        updateObj.setId(config.getId());
        updateObj.setValue(JsonUtils.toJsonString(value));
        configMapper.updateById(updateObj);
    }

    @Nonnull
    @Override
    public <T> T getConfig(String key, Class<T> clazz) {
        ConfigDO config = configService.getConfigByKey(key);
        if (config == null) {
            log.error("[getConfig][配置不存在，key({})", key);
            return ReflectUtil.newInstance(clazz);
        }
        if (!JsonUtils.isJson(config.getValue())) {
            log.error("[getConfig][不是有效的JSON字符串，key({}) value({})", key, config.getValue());
            return ReflectUtil.newInstance(clazz);
        }
        T t = JsonUtils.parseObject2(config.getValue(), clazz);
        if (t == null) {
            log.error("[getConfig][配置解析失败，key({}) clazz({})", key, clazz.getName());
            return ReflectUtil.newInstance(clazz);
        }
        return t;
    }

}
